package org.web.demo.filter;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @author yexi
 */
@WebFilter(
        filterName = "编码过滤器"
        , servletNames = {"请求转发测试Servlet"}
        , urlPatterns = {"/forward", "/AJAXServlet", "/cookie_session", "/list"}
)
@Slf4j
public class EncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("EncodingFilter初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("EncodingFilter进行过滤操作");
        servletRequest.setCharacterEncoding("UTF-8");
        /**
         * WARN: 重坑点！
         * 如果要设置编码必须在转发之前进行设置，因为该setContentType方法在使用Writer的情况下是不可变的。
         * 而我们使用转发一般需要转发jsp或者html，Writer必然被使用到，而当编码未设置情况下，默认就会采用iso-8859-1编码，
         * 此时想改变也来不及了。
         * <p>
         * 所以应用在过滤器上，则必须在执行doFilter方法之前设置好。
         *
         * @see Response#setContentType(String)
         * @see Response#getWriter()
         */
        servletResponse.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        log.info("EncodingFilter销毁");
    }


}
